package com.vehiclemanagement.util;

import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * 统一响应对象
 */
@ApiModel(value = "R", description = "统一API响应结果")
public class R<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    
    /**
     * 状态码
     */
    @ApiModelProperty(value = "状态码", example = "200", required = true, position = 1)
    private Integer code;
    
    /**
     * 消息
     */
    @ApiModelProperty(value = "响应消息", example = "操作成功", required = true, position = 2)
    private String message;
    
    /**
     * 数据
     */
    @ApiModelProperty(value = "响应数据", position = 3)
    private T data;
    
    public R() {
    }
    
    public R(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    
    public R(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    
    /**
     * 成功返回结果
     */
    public static <T> R<T> ok() {
        return new R<>(200, "操作成功");
    }
    
    /**
     * 成功返回结果：最终返回一个包含以下JSON结构的响应
     *  {
     "code": 200,
     "message": "操作成功",
     "data": {
       // 这里是IPage<Binding>对象序列化后的内容
       // 包含记录、总数、页码等信息
     }
   }
     * @param data 获取的数据
     */
    public static <T> R<T> ok(T data) {
        return new R<>(200, "操作成功", data);    //创建一个R对象，并返回
    }
    
    /**
     * 成功返回结果
     *
     * @param message 提示信息
     * @param data 获取的数据
     */
    public static <T> R<T> ok(String message, T data) {   //<T>：泛型，表示这是一个泛型方法，可以接受任何类型的数据
        return new R<>(200, message, data);  //创建一个R对象，并返回    
    }
    
    /**
     * 失败返回结果
     */
    public static <T> R<T> error() {
        return new R<>(500, "操作失败");
    }
    
    /**
     * 失败返回结果
     *
     * @param message 提示信息
     */
    public static <T> R<T> error(String message) {
        return new R<>(500, message);
    }
    
    /**
     * 失败返回结果
     *
     * @param code 状态码
     * @param message 提示信息
     */
    public static <T> R<T> error(Integer code, String message) {
        return new R<>(code, message);
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
} 